home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / twars.arc / TW2001.PAS < prev    next >
Pascal/Delphi Source File  |  1991-04-28  |  34KB  |  1,337 lines

  1. PROGRAM tw2001;
  2.  
  3. {(*$C-*) (*$V-*)}
  4. (*$I COMMON.PAS*)
  5.  
  6. CONST
  7.       fs = 'TWDATA.DAT';
  8.       p  : ARRAY[1..3] OF STR =
  9.                                 ('Ore.......','Organics..','Equipment.');
  10.       b  : ARRAY[1..3] OF INTEGER =
  11.                                     (10,20,35);
  12.  
  13. TYPE
  14.      users = RECORD
  15.                fa                   : STRING[41];
  16.                FAREAL               : STRING[41];
  17.                fb,fc,fd,fe,ff,fg    : INTEGER;
  18.                fh,fi,fj,fk,fl,fr,fp : INTEGER;
  19.                fm,fo,fq,ft,fv       : INTEGER;
  20.                credits              : real;
  21.              END;
  22.  
  23.      teamrec  = RECORD
  24.                name                 : string[41];
  25.                captain              : string[41];
  26.                datemade             : string[8];
  27.                password             : string[8];
  28.                rank                 : real;
  29.                kills                : integer;
  30.              END;
  31.  
  32.  
  33. VAR
  34.     smg         : FILE OF smr;
  35.     pnn         : STRING[41];
  36.     message1    : STRING[160];
  37.     y,
  38.     a,
  39.     mo,
  40.     d,
  41.     go,
  42.     pn,
  43.     pd,
  44.     s2,
  45.     st,
  46.     medalpts,
  47.     asd,
  48.     g2,
  49.     prr         : INTEGER;
  50.     ay,
  51.     tt,
  52.     oath,
  53.     lp,
  54.     ls,
  55.     lt1,
  56.     ll1         : INTEGER;
  57.     userf       : FILE OF users;
  58.     userz,
  59.     userr,usert : users;
  60.     e           :  ARRAY[1..6] OF INTEGER;
  61.     teams       : file of teamrec;
  62.     rteams,
  63.     tteams      : teamrec;
  64.     m,
  65.     n,
  66.     pub,
  67.     c1,
  68.     h           : ARRAY[0..3] OF REAL;
  69.     s           : ARRAY[0..1000,0..1] OF INTEGER;
  70.     srr         : ARRAY[0..3,0..1] OF REAL;
  71.     g           : ARRAY[0..9,0..1]   OF INTEGER;
  72.     ended,
  73.     autop,
  74.     players,
  75.     planets,
  76.     ports,
  77.     drop,
  78.     done        : BOOLEAN;
  79.     aim         : STR;
  80.     msger       : TEXT;
  81.  
  82. FUNCTION SGN(I:INTEGER) : INTEGER;
  83. BEGIN
  84.    IF I>0 THEN SGN := 1
  85.    ELSE IF I<0 THEN SGN := -1
  86.         ELSE SGN := 0;
  87. END;
  88.  
  89. PROCEDURE readin(i:INTEGER;VAR user:users);
  90. BEGIN
  91.   SEEK(userf,i);
  92.   READ(userf,user);
  93. END;
  94.  
  95. PROCEDURE writeout(i:INTEGER;user:users);
  96. BEGIN
  97.   SEEK(userf,i);
  98.   WRITE(userf,user);
  99. END;
  100.  
  101. PROCEDURE getdate;
  102.  
  103.   VAR
  104.       a,code    : INTEGER;
  105.       datea : STR;
  106. BEGIN
  107.     d := daynum(date)-1094;
  108. END;
  109.  
  110. PROCEDURE ssm(dest:INTEGER; s:STR);
  111.  
  112. VAR
  113.     x: smr;
  114.     e,cp,t: INTEGER;
  115.     u: userrec;
  116. BEGIN
  117.   (*$I-*)
  118.   RESET(smg);(*$I+*)
  119.   IF IORESULT<>0
  120.     THEN
  121.       REWRITE(smg);
  122.   e := FILESIZE(smg);
  123.   IF e=0
  124.     THEN
  125.       cp := 0
  126.     ELSE
  127.       BEGIN
  128.         t := e-1;
  129.         SEEK(smg,t);
  130.         READ(smg,x);
  131.         WHILE (t>0) AND (x.destin=-1) DO
  132.           BEGIN
  133.             t := t-1;
  134.             SEEK(smg,t);
  135.             READ(smg,x);
  136.           END;
  137.         cp := t+1;
  138.       END;
  139.   SEEK(smg,cp);
  140.   x.msg := s;
  141.   x.destin := dest;
  142.   WRITE(smg,x);
  143.   CLOSE(smg);
  144. END;
  145.  
  146. PROCEDURE message(p,po,n,n1: INTEGER);
  147. BEGIN
  148.   IF (po<2)
  149.     THEN
  150.       ssm(p,'The Ferrengi destroyed '+cstr(n)+' fighters.')
  151.     ELSE
  152.       BEGIN
  153.         readin(po,usert);
  154.         if n1=0 then
  155.         WITH usert DO
  156.           ssm(p,fa+' destroyed '+cstr(n)+' fighters.')
  157.         ELSE
  158.         WITH usert DO
  159.           ssm(p,fa+' destroyed '+cstr(n1)+' shield points and '
  160.           +cstr(n)+' of your fighters.');
  161.       END;
  162. END;
  163.  
  164. PROCEDURE removeship(p:INTEGER);
  165.  
  166.   VAR
  167.       r,b  : INTEGER;
  168.       done : BOOLEAN;
  169. BEGIN
  170.   readin(p,usert);
  171.   r := usert.ff;
  172.   IF r<>0
  173.     THEN
  174.       BEGIN
  175.         readin(lp+r,usert);
  176.         a := usert.fi;
  177.         IF a<>0
  178.           THEN
  179.             IF a=p
  180.               THEN
  181.                 BEGIN
  182.                   readin(a,usert);
  183.                   b := usert.fo;
  184.                   readin(lp+r,usert);
  185.                   usert.fi := b;
  186.                   writeout(lp+r,usert);
  187.                 END
  188.               ELSE
  189.                 BEGIN
  190.                   done := FALSE;
  191.                   readin(a,usert);
  192.                   REPEAT
  193.                     IF usert.fo = p
  194.                       THEN
  195.                         BEGIN
  196.                           b := a;
  197.                           done := TRUE;
  198.                         END;
  199.                     a := usert.fo;
  200.                     readin(a,usert);
  201.                   UNTIL done;
  202.                   a := usert.fo;
  203.                   readin(b,usert);
  204.                   usert.fo := a;
  205.                   writeout(b,usert);
  206.                 END;
  207.         readin(pn,userr);
  208.       END;
  209. END;
  210.  
  211.  
  212. PROCEDURE rsm;
  213.  
  214. VAR
  215.     x: smr;
  216.     i: INTEGER;
  217.     NOTHING : BOOLEAN;
  218. BEGIN
  219.   nothing := TRUE;
  220.   (*$I-*)
  221.   RESET(smg); (*$I+*)
  222.   IF IORESULT=0
  223.     THEN
  224.       BEGIN
  225.         i := 0;
  226.         REPEAT
  227.           IF i<=FILESIZE(smg)-1
  228.             THEN
  229.               BEGIN
  230.                 SEEK(smg,i);
  231.                 READ(smg,x);
  232.               END;
  233.           WHILE (i<FILESIZE(smg)-1) AND (x.destin<>pn) DO
  234.             BEGIN
  235.               i := i+1;
  236.               SEEK(smg,i);
  237.               READ(smg,x);
  238.             END;
  239.           IF (x.destin=pn) AND (i<=FILESIZE(smg)-1)
  240.             THEN
  241.               BEGIN
  242.                 print(x.msg);
  243.                 SEEK(smg,i);
  244.                 x.destin := -1;
  245.                 WRITE(smg,x);
  246.                 nothing := FALSE;
  247.               END;
  248.           i := i+1;
  249.         UNTIL (i>FILESIZE(smg)-1) OR hangup;
  250.         CLOSE(smg);
  251.       END;
  252.       if nothing then print('Nothing');
  253. END;
  254.  
  255.  
  256. PROCEDURE delplr(p: INTEGER);
  257.  
  258.   VAR
  259.       l: INTEGER;
  260. BEGIN
  261.   readin(p,usert);
  262.   print('Terminating '+usert.fa+' ('+cstr(p)+')...');
  263.   removeship(p);
  264.   readin(p,usert);
  265.   usert.fm := 0;
  266.   usert.fareal := 'Not used';
  267.   writeout(p,usert);
  268.   FOR l:=lp+1 TO ls DO
  269.     BEGIN
  270.       readin(l,usert);
  271.       IF usert.fm=p
  272.         THEN
  273.           BEGIN
  274.             usert.fm := -2;
  275.             writeout(l,usert);
  276.           END;
  277.     END;
  278.   pn := p;
  279.   rsm;
  280.   FOR l:=2 TO lp DO
  281.     BEGIN
  282.       readin(l,usert);
  283.       IF usert.fc=p
  284.         THEN
  285.           BEGIN
  286.             usert.fc := -98;
  287.             writeout(l,usert);
  288.           END;
  289.     END;
  290. END;
  291.  
  292. PROCEDURE shortest(a,b: INTEGER);
  293.  
  294.   VAR
  295.       n,c,l,m : INTEGER;
  296.       found   : BOOLEAN;
  297. BEGIN
  298.   if b>1000 then b:= 1000;
  299.   n := 1;
  300.   c := b;
  301.   IF a=b
  302.     THEN
  303.       BEGIN
  304.         s[0,0] := a;
  305.         s[0,1] := 0;
  306.         s[a,1] := 0;
  307.       END
  308.     ELSE
  309.       BEGIN
  310.         FOR l:=1 TO 1000 DO
  311.           FOR m:=0 TO 1 DO
  312.             s[l,m] := 0;
  313.         s[a,1] := 1;
  314.         found := FALSE;
  315.         REPEAT
  316.           l := 1;
  317.           REPEAT
  318.             IF s[l,1]=n
  319.               THEN
  320.                 BEGIN
  321.                   readin(l+lp,usert);
  322.                   e[1] := usert.fb;
  323.                   e[2] := usert.fc;
  324.                   e[3] := usert.fd;
  325.                   e[4] := usert.fe;
  326.                   e[5] := usert.ff;
  327.                   e[6] := usert.fg;
  328.                   FOR m:=1 TO 6 DO
  329.                     IF e[m]<>0
  330.                       THEN
  331.                         IF s[e[m],1]=0
  332.                           THEN
  333.                             BEGIN
  334.                               s[e[m],1] := n+1;
  335.                               s[e[m],0] := l;
  336.                               IF e[m]=b
  337.                                 THEN
  338.                                   found := TRUE;
  339.                             END;
  340.                 END;
  341.             l := l+1;
  342.           UNTIL found OR (l>1000);
  343.           IF NOT found
  344.             THEN
  345.               n := n+1;
  346.         UNTIL found OR (n>=60);
  347.         IF NOT found
  348.           THEN
  349.             BEGIN
  350.               sysoplog('*** Error - Sector path not found - from sector'
  351.                        +cstr(a)+' to sector'+cstr(b));
  352.               print('*** Error - Sector path not found - from sector'+cstr(a)+
  353.               ' to sector'+cstr(b));
  354.               s[a,1] := 0;
  355.               ended := TRUE;
  356.             END
  357.           ELSE
  358.             REPEAT
  359.               s[s[c,0],1] := c;
  360.               c := s[c,0];
  361.               IF s[c,0]=0
  362.                 THEN
  363.                   s[b,1] := 0;
  364.             UNTIL s[c,0]=0;
  365.       END;
  366. END;
  367.  
  368. PROCEDURE rank(VAR p: INTEGER);
  369.  
  370.   VAR
  371.       l,g0,h0,f0,n,o,j0,k0,l0,v,c : INTEGER;
  372.       done                        : BOOLEAN;
  373. BEGIN
  374.   FOR l:=2 TO lp DO
  375.     BEGIN
  376.       readin(l,usert);
  377.       IF usert.fm=0
  378.         THEN
  379.           BEGIN
  380.             usert.fv := -1;
  381.             writeout(l,usert);
  382.           END
  383.         ELSE
  384.           IF ((usert.fc<>0) AND (usert.fc<>-75)) OR (pos('THE CABAL',usert.fa)>0) OR (pos('THE FERRENGI',usert.fa)>0)
  385.             THEN
  386.               BEGIN
  387.                 usert.fv := 0;
  388.                 writeout(l,usert);
  389.               END
  390.             ELSE
  391.               BEGIN
  392.                 g0 := usert.fg;
  393.                 h0 := usert.fh;
  394.                 f0 := usert.fi;
  395.                 j0 := usert.fj;
  396.                 k0 := usert.fk;
  397.                 v := g0*10+h0*50+ROUND(f0*2.5)+j0*5+ROUND(k0*8.75);
  398.                 usert.fv := v;
  399.                 writeout(l,usert);
  400.               END;
  401.     END;
  402.   p := 0;
  403.   FOR l:=2 TO lp DO
  404.     BEGIN
  405.       readin(l,usert);
  406.       v := usert.fv;
  407.       IF v<>-1
  408.         THEN
  409.           BEGIN
  410.             n := p;
  411.             o := 0;
  412.             done := FALSE;
  413.             IF p=0
  414.               THEN
  415.                 BEGIN
  416.                   p := l;
  417.                   usert.ft := -1;
  418.                   writeout(l,usert);
  419.                 END
  420.               ELSE
  421.                 REPEAT
  422.                   readin(n,usert);
  423.                   IF (v>usert.fv) AND (o=0)
  424.                     THEN
  425.                       BEGIN
  426.                         readin(l,usert);
  427.                         usert.ft := p;
  428.                         writeout(l,usert);
  429.                         p := l;
  430.                         done := TRUE;
  431.                       END
  432.                     ELSE
  433.                       IF v>usert.fv
  434.                         THEN
  435.                           BEGIN
  436.                             readin(o,usert);
  437.                             c := usert.ft;
  438.                             usert.ft := l;
  439.                             writeout(o,usert);
  440.                             readin(l,usert);
  441.                             usert.ft := c;
  442.                             writeout(l,usert);
  443.                             done := TRUE;
  444.                           END
  445.                         ELSE
  446.                           IF usert.ft=-1
  447.                             THEN
  448.                               BEGIN
  449.                                 readin(n,usert);
  450.                                 usert.ft := l;
  451.                                 writeout(n,usert);
  452.                                 readin(l,usert);
  453.                                 usert.ft := -1;
  454.                                 writeout(l,usert);
  455.                                 done := TRUE;
  456.                               END
  457.                             ELSE
  458.                               BEGIN
  459.                                 o := n;
  460.                                 n := usert.ft;
  461.                               END;
  462.                 UNTIL done;
  463.           END;
  464.     END;
  465. END;
  466.  
  467. PROCEDURE killed(pn,p: INTEGER);
  468.  
  469.   VAR
  470.       l : INTEGER;
  471. BEGIN
  472.   removeship(p);
  473.   readin(p,usert);
  474.   usert.fc := pn;
  475.   usert.ff := 0;
  476.   writeout(p,usert);
  477.   FOR l:=lp+1 TO ls DO
  478.     BEGIN
  479.       readin(l,usert);
  480.       IF (usert.fm=p) AND (random(2)=0)
  481.         THEN
  482.           BEGIN
  483.             usert.fm := -2;
  484.             writeout(l,usert);
  485.           END;
  486.     END;
  487. END;
  488.  
  489.  
  490. PROCEDURE mmkey(VAR i:STR);
  491.  
  492. VAR
  493.     c: CHAR;
  494. BEGIN
  495.   REPEAT
  496.     REPEAT
  497.     ansic(3);
  498.       getkey(c);
  499.       skey(c);
  500.     UNTIL (((c>=' ') AND (c<CHR(127))) OR (c=CHR(13))) OR hangup;
  501.     c := UPCASE(c);
  502.     write(c);
  503.     thisline := thisline+c;
  504.     IF (c='/') OR (c='1')
  505.       THEN
  506.         BEGIN
  507.           i := c;
  508.           REPEAT
  509.            getkey(c);
  510.             skey(c);
  511.           UNTIL ((c>=' ')AND(c<=CHR(127))) OR (c=CHR(13)) OR (c=CHR(8)) OR
  512.                 hangup;
  513.           c := UPCASE(c);
  514.           IF c<>CHR(13)
  515.             THEN
  516.               BEGIN
  517.                 write(c);
  518.                 thisline := thisline+c;
  519.               END;
  520.           IF (c=CHR(8)) OR (c=CHR(127))
  521.             THEN
  522.               prompt(' '+c);
  523.           IF c='/'
  524.             THEN
  525.               INPUT(i,20)
  526.             ELSE
  527.               IF c<>CHR(13)
  528.                 THEN
  529.                   i := i+c;
  530.         END
  531.       ELSE
  532.         i := c;
  533.   UNTIL (c<>CHR(8)) AND (c<>CHR(127)) OR hangup;
  534.   nl;
  535. END;
  536.  
  537. PROCEDURE addmsg(i:STR);
  538. BEGIN
  539.   WRITELN(msger,i);
  540. END;
  541.  
  542. PROCEDURE readmsg;
  543. BEGIN
  544.   print('The following happened to your ship since your last time on:');
  545.   rsm;
  546. END;
  547.  
  548. PROCEDURE addship(p:INTEGER);
  549.  
  550.   VAR
  551.       r,b  : INTEGER;
  552.       done : BOOLEAN;
  553. BEGIN
  554.   r := userr.ff;
  555.   IF r<>0
  556.     THEN
  557.       BEGIN
  558.         readin(lp+r,usert);
  559.         b := usert.fi;
  560.         usert.fi := p;
  561.         writeout(lp+r,usert);
  562.         userr.fo := b;
  563.         writeout(pn,userr);
  564.       END;
  565. END;
  566.  
  567.  
  568. PROCEDURE warped;
  569.  
  570.   VAR
  571.       lee,l : INTEGER;
  572. BEGIN
  573.   prompt('Warp Lanes lead to: ');
  574.   l := 0;
  575.   repeat
  576.     l := l+1;
  577.     lee := l+1;
  578.   until e[l]<>0;
  579.   prompt(cstr(e[l]));
  580.   FOR l:=lee TO 6 DO
  581.     IF e[l]<>0 THEN
  582.        prompt(','+cstr(e[l]));
  583.   nl;
  584. END;
  585.  
  586. PROCEDURE showroom;
  587.  
  588.   VAR
  589.       l,lee : INTEGER;
  590.       st4   : str;
  591.       temy  : string[4];
  592.       tname : str;
  593. BEGIN
  594.   prr := userr.ff;
  595.   s2 := prr+lp;
  596.   nl;
  597.   readin(s2,usert);
  598.   ansic(3);
  599.   if usert.fa<>'' then st4:=usert.fa else st4:='deep space';
  600.   print('Sector: '+cstr(prr)+' ('+st4+')');
  601.   st := usert.fh;
  602.   IF st<>0
  603.     THEN
  604.       BEGIN
  605.         readin(st+ls,usert);
  606.         if ports then drop := TRUE;
  607.         ansic(4);
  608.         print('Ports: '+usert.fa+', class '+cstr(usert.fb));
  609.       END
  610.     ELSE
  611.       BEGIN
  612.         ansic(4);
  613.         print('Ports: None');
  614.       END;
  615.   readin(s2,usert);
  616.   a := usert.fo;
  617.   IF a<>0
  618.     THEN
  619.       BEGIN
  620.         readin(a+lt1,usert);
  621.         if planets then drop := TRUE;
  622.         ansic(5);
  623.         print('Planet: '+usert.fa);
  624.         readin(s2,usert);
  625.       END;
  626.   g2 := 0;
  627.   prompt('Other Ships: ');
  628.   ansic(6);
  629.   a := usert.fi;
  630.   IF a=0
  631.     THEN
  632.       print('None')
  633.     ELSE
  634.       BEGIN
  635.         REPEAT
  636.           readin(a,usert);
  637.           IF a<>pn
  638.             THEN
  639.               BEGIN
  640.                 if usert.fr <> 0 then temy := '['+cstr(usert.fr)+']'
  641.                   else temy := '';
  642.                 if players then drop := TRUE;
  643.                 nl;
  644.                 prompt('   '+usert.fa+' '+temy+', with '+cstr(usert.fg)+' fighters, in a');
  645.                 if (usert.fh<20) then prompt('n incredibly');
  646.                 if (usert.fh<35) then prompt(' small');
  647.                 if (usert.fh>50) AND (usert.fh<65) then prompt(' large');
  648.                 if (usert.fh>64) then prompt('n enormous');
  649.                 prompt(' merchant ');
  650.                 if (usert.fh<75) then prompt('ship') else prompt('Super Cruiser');
  651.                 g2 := 1;
  652.               END;
  653.           a := usert.fo;
  654.         UNTIL a=0;
  655.         IF g2=0
  656.           THEN
  657.             print('None')
  658.           ELSE
  659.             nl;
  660.         ansic(1);
  661.       END;
  662.   readin(s2,usert);
  663.   prompt('Fighters in sector: ');
  664.   ansic(7);
  665.   if usert.fl=0 then print('None')
  666.   ELSE
  667.     BEGIN
  668.       aim := cstr(usert.fl);
  669.       IF (usert.fm=-2) then print(aim+' (Rogue Mercenaries)')
  670.       ELSE
  671.         if (usert.fm=-75) then print(aim+' (Space Pirates)')
  672.         ELSE
  673.           IF (usert.fm=-1) then print(aim+' (belong to The Ferrengi)')
  674.           ELSE
  675.             IF usert.fm=pn then print(aim+' (yours)')
  676.             ELSE
  677.               IF (usert.fm < (-10)) AND (usert.fm > (-61)) then
  678.                 begin
  679.                   seek(teams,abs(usert.fm)-10);
  680.                   read(teams,tteams);
  681.                   if ((rteams.name = tteams.name) and (userr.fr<>0)) then
  682.                     print(aim+' (belong to your team)')
  683.                   ELSE print(aim+' (belong to team#'+cstr(abs(usert.fm)-10)+', '+tteams.name+')');
  684.                 end
  685.               ELSE
  686.               BEGIN
  687.                 readin(usert.fm,usert);
  688.                 print(aim+' (belong to '+usert.fa+')');
  689.                 readin(s2,usert);
  690.               END;
  691.     END;
  692.   warped;
  693. END;
  694.  
  695.  
  696. PROCEDURE destroyed;
  697. BEGIN
  698.   print('Your ship has been destroyed!');
  699.   nl;
  700.   print('You will start over tomorrow with a new ship.');
  701.   print('It is better to practice dying than to die unprepared!');
  702.   killed(pn,pn);
  703.   ended := TRUE;
  704.   done := TRUE;
  705. END;
  706.  
  707. PROCEDURE info(pn:INTEGER);
  708.  
  709.   VAR
  710.       a: REAL;
  711.       b,c : INTEGER;
  712.       temy : string[12];
  713.       tname : str;
  714. BEGIN
  715.   readin(pn,usert);
  716.   nl;
  717.   if usert.fr <> 0 then
  718.     begin
  719.       temy := '  Team #'+cstr(usert.fr)+', ';
  720.       tname := rteams.name;
  721.     end
  722.   else
  723.     begin
  724.       temy := '';
  725.       tname := '';
  726.     end;
  727.   ansic(7);
  728.   print('Name: '+usert.fa+temy+tname);
  729.   ansic(2);
  730.   print('Sector: '+cstr(usert.ff)+'   Turns left: '+cstr(usert.fd));
  731.   ansic(3);
  732.   print('Fighters: '+cstr(usert.fg)+'   Shield points: '+cstr(usert.fe));
  733.   ansic(4);
  734.   print('Cargo Holds: '+cstr(usert.fh)+'   Empty: '+cstr(usert.fh-usert.fi-usert.fj-usert.fk));
  735.   ansic(3);
  736.   print('  Ore: '+cstr(usert.fi)+'   Org: '+cstr(usert.fj)+'   Eqp: '+cstr(usert.fk));
  737.   ansic(2);
  738.   print('Credits: '+cstrr(usert.credits,10));
  739.   ansic(1);
  740.   nl;
  741. END;
  742.  
  743. PROCEDURE retreat;
  744.  
  745.   VAR
  746.       lr : INTEGER;
  747. BEGIN
  748.   ansic(8);
  749.   print('<Retreat>');
  750.   ansic(1);
  751.   lr := userr.fq;
  752.   WHILE (lr=0) OR (lr=prr) DO
  753.     lr := e[RANDOM(6)+1];
  754.   IF userr.fg >=1
  755.     THEN
  756.       BEGIN
  757.         userr.fg := userr.fg-1;
  758.         writeout(pn,userr);
  759.         print('Your fighters make a valiant attempt to stall the oncoming horde.');
  760.         print('You have '+cstr(userr.fg)+' fighter(s) left.');
  761.         removeship(pn);
  762.         userr.ff := lr;
  763.         userr.fq := prr;
  764.         writeout(pn,userr);
  765.         addship(pn);
  766.         lr := a;
  767.         done := TRUE;
  768.       END
  769.     ELSE
  770.       IF userr.fe>4 then
  771.       begin
  772.         ansic(7);
  773.         print('The oncoming horde is fast & powerful, but your ship armor held...');
  774.         ansic(8);
  775.         print('...this time...');
  776.         removeship(pn);
  777.         userr.fe := userr.fe-5;
  778.         userr.ff := lr;
  779.         userr.fq := prr;
  780.         writeout(pn,userr);
  781.         addship(pn);
  782.         lr := a;
  783.         done := TRUE;
  784.         END
  785.     ELSE
  786.       IF RANDOM(2)+1=1
  787.         THEN
  788.           BEGIN
  789.             ansic(7);
  790.             print('Lucky ghuy''cha''! You escaped!');
  791.             ansic(1);
  792.             removeship(pn);
  793.             userr.ff := lr;
  794.             userr.fq := prr;
  795.             writeout(pn,userr);
  796.             addship(pn);
  797.             lr := a;
  798.             done := TRUE;
  799.           END
  800.         ELSE
  801.           BEGIN
  802.             ansic(6);
  803.             print('A fitting fate for you, coward: you didn''t escape!');
  804.             ansic(1);
  805.             destroyed;
  806.           END;
  807.   prr := userr.ff;
  808.   s2 := prr+lp;
  809.   readin(s2,usert);
  810.   e[1] := usert.fb;
  811.   e[2] := usert.fc;
  812.   e[3] := usert.fd;
  813.   e[4] := usert.fe;
  814.   e[5] := usert.ff;
  815.   e[6] := usert.fg;
  816.   nl;
  817. END;
  818.  
  819.  
  820. PROCEDURE attack(VAR s2,f2,e2:INTEGER);
  821.  
  822.   VAR
  823.       i : STR;
  824.       n,l,k,t1 : INTEGER;
  825. BEGIN
  826.   ansic(8);
  827.   print('<Attack>');
  828.   ansic(1);
  829.   IF f2<1
  830.     THEN
  831.       BEGIN
  832.         ansic(6);
  833.         print('You don''t have any fighters!');
  834.         ansic(1);
  835.       END
  836.     ELSE
  837.       BEGIN
  838.         prompt('How many fighters do you wish to use? ');
  839.         INPUT(i,4);
  840.         n := value(i);
  841.         IF (n>=1) AND (n<=9999)
  842.           THEN
  843.             BEGIN
  844.               l := 0;
  845.               k := 0;
  846.               IF n>f2
  847.                 THEN
  848.                   BEGIN
  849.                     nl;
  850.                     print('You don''t have that many fighters.')
  851.                   END
  852.                 ELSE
  853.                   BEGIN
  854.                     WHILE (l<n) AND (k<e2) DO
  855.                       IF RANDOM(2)+1=1
  856.                         THEN
  857.                           l := l+1
  858.                         ELSE
  859.                           k := k+1;
  860.                     f2 := f2-l;
  861.                     e2 := e2-k;
  862.                     userr.fg := f2;
  863.                     writeout(pn,userr);
  864.                     readin(s2,usert);
  865.                     if usert.fm > 1 THEN
  866.                        ssm(usert.fm,userr.fa+' destroyed '+cstr(k)+
  867.                        ' of your fighters in sector '+cstr(userr.ff));
  868.                     if usert.fm < -10 then
  869.                     begin
  870.                       seek(teams,abs(usert.fm)-10);
  871.                       read(teams,tteams);
  872.                       t1:=1;
  873.                       repeat
  874.                         t1:=t1+1;
  875.                         readin(t1,userz);
  876.                       until ((userz.fa = tteams.captain) or (t1>150));
  877.                       if t1<151 then
  878.                         ssm(t1,userr.fa+' destroyed '+cstr(k)+
  879.                         ' of your team''s fighters in sector '+cstr(userr.ff));
  880.                     end;
  881.                     usert.fl := e2;
  882.                     writeout(s2,usert);
  883.                     IF e2<1
  884.                       THEN
  885.                         BEGIN
  886.                           usert.fl := 0;
  887.                           usert.fm := 0;
  888.                           writeout(s2,usert);
  889.                         END;
  890.                     ansic(2);
  891.                     print('You lost '+cstr(l)+' fighter(s)');
  892.                     ansic(7);
  893.                     print('You destroyed '+cstr(k)+' enemy fighters.');
  894.                     ansic(1);
  895.                     IF (usert.fm<0) and (usert.fm>-11)
  896.                       THEN
  897.                         BEGIN
  898.                           n := random(100)+1;
  899.                           userr.credits := userr.credits+(n*k);
  900.                           nl;
  901.                           print('You just received '+cstr(n*k)+
  902.                           ' Bounty Credits for that!');
  903.                           writeout(pn,userr);
  904.                         END;
  905.                     IF e2<=0
  906.                       THEN
  907.                         BEGIN
  908.                           ansic(7);
  909.                           print('You destroyed all the fighters.');
  910.                           ansic(1);
  911.                           done := TRUE;
  912.                         END;
  913.                   END;
  914.             END;
  915.       END;
  916. END;
  917.  
  918.  
  919.  
  920. PROCEDURE enterroom;
  921.  
  922.   VAR
  923.       f2,e2,r1 : INTEGER;
  924.       i        : STR;
  925.  
  926.   OVERLAY PROCEDURE inclear;
  927.   BEGIN
  928.     IF NOT ENDED then
  929.     IF prr<>85
  930.       THEN
  931.         showroom
  932.       ELSE
  933.         BEGIN
  934.           nl;
  935.           nl;
  936.           ansic(8);
  937.           print('You''ve defeated the Ferrengi and recieved an Imperial Commendation!');
  938.           ansic(4);
  939.           print(
  940.             'Unfortunately, the Ferrengi are too stupid to know they''re beaten...'
  941.           );
  942.           readin(s2,usert);
  943.           usert.fl := 2000;
  944.           usert.fm := -1;
  945.           writeout(s2,usert);
  946.           ansic(1);
  947.           addmsg('Congrats to '+pnn+' who smashed the Ferrengi fleet on '+date
  948.                  +' and received an Imperial Commendation.');
  949.         END;
  950.   END;
  951.  
  952. BEGIN
  953.    removeship(pn);
  954.    medalpts := userr.fg;
  955.    addship(pn);
  956.    prr := userr.ff;
  957.    s2 := prr+lp;
  958.    readin(s2,usert);
  959.    e[1] := usert.fb;
  960.    e[2] := usert.fc;
  961.    e[3] := usert.fd;
  962.    e[4] := usert.fe;
  963.    e[5] := usert.ff;
  964.    e[6] := usert.fg;
  965.    nl;
  966.    IF (S2>9) AND (USERT.FP > 0) THEN
  967.       BEGIN
  968.          R1 := RANDOM(10)+1;
  969.          IF USERT.FP-R1>=0 THEN
  970.             BEGIN
  971.                USERT.FP := USERT.FP - 1;      (* REDUCE MINE COUNT *)
  972.                WRITEOUT(S2,USERT);
  973.                R1 := RANDOM(26)+5;           (* MINE DAM 5 - 30 *)
  974.                USERR.FE := USERR.FE-R1;       (* SHIP ARMOR DOWN *)
  975.                ANSIC(8);
  976.                PRINT('A space mine detonates near you!');
  977.                addmsg(userr.fa+' ran into a mine!');
  978.                sysoplog('  - - - Mine detonates... '+cstr(r1)+' pnts on user '+userr.fa);
  979.                PRINT('The console reports damages of '+cstr(r1)+' battle points!');
  980.                IF userr.fe > -1 THEN
  981.                   BEGIN
  982.                     ANSIC(7);
  983.                     PRINT('Your ship''s shields absorb the brunt of the explosion!');
  984.                     writeout(pn,userr);
  985.                   END
  986.                ELSE
  987.                   BEGIN
  988.                      R1 := (-USERR.FE);      (* DAM LESS ARMOR *)
  989.                      IF R1>USERR.FG THEN     (* NOT ENOUGH FIGHTERS  *)
  990.                        BEGIN
  991.                           ANSIC(8);
  992.                           userr.fg := 0;
  993.                           PRINT('Life Support knocked out!  Energy generation shut down!');
  994.                           nl;
  995.                           ANSIC(3);
  996.                           SYSOPLOG(userr.fa+' got blown up dead');
  997.                           addmsg(userr.fa+' was destroyed by a mine on '+date+', at '+time);
  998.                           PRINT('In space, there''s no one to hear you scream...');
  999.                           writeout(pn,userr);
  1000.                           destroyed;
  1001.                           readin(s2,usert);
  1002.                        END
  1003.                      ELSE
  1004.                        BEGIN
  1005.                           ANSIC(7);
  1006.                           PRINT(cstr(r1)+' K3-A Fighters destroyed by the blast!');
  1007.                           userr.fe := 0;
  1008.                           drop := TRUE;
  1009.                           userr.fg := userr.fg - r1;
  1010.                           writeout(pn,userr);
  1011.                        END;
  1012.                   END;
  1013.             END;
  1014.       END;
  1015.   IF (usert.fm<>pn) AND ((-1*(usert.fm))-10 <> userr.fr)
  1016.      THEN
  1017.        IF usert.fl<>0
  1018.          THEN
  1019.            BEGIN
  1020.              showroom;
  1021.              nl;
  1022.              drop := TRUE;
  1023.              ansic(6);
  1024.              print(
  1025.                 'You have to destroy the fighters before entering this sector.'
  1026.              );
  1027.              f2 := userr.fg;
  1028.              readin(s2,usert);
  1029.              e2 := usert.fl;
  1030.              nl;
  1031.              ansic(1);
  1032.              done := FALSE;
  1033.              WHILE (NOT done) AND (NOT hangup) DO
  1034.                BEGIN
  1035.                  print('Fighters: '+cstr(f2)+' / '+cstr(e2));
  1036.                  dump;
  1037.                  tleft;
  1038.                  prompt('Option? (A,D,I,Q,R,?):? ');
  1039.                  mmkey(i);
  1040.                  IF i=''
  1041.                    THEN
  1042.                      print('? =<Help>');
  1043.                  CASE i[1] OF
  1044.                    'R' : retreat;
  1045.                    'D' : BEGIN
  1046.                            print('<Display>');
  1047.                            showroom;
  1048.                          END;
  1049.                    'A' : attack(s2,f2,e2);
  1050.                    'I' : BEGIN
  1051.                            print('<Info>');
  1052.                            info(pn);
  1053.                          END;
  1054.                    '?' : printfile('tradewar\twrethlp.msg');
  1055.                  END;
  1056.                END;
  1057.            END
  1058.          ELSE
  1059.            inclear
  1060.      ELSE
  1061.        inclear;
  1062. END;
  1063.  
  1064. PROCEDURE moveit;
  1065.  
  1066.   VAR
  1067.       t2,l,t,lee : INTEGER;
  1068.       i    : STR;
  1069.       done : BOOLEAN;
  1070. BEGIN
  1071.   print('<Move>');
  1072.   t2 := userr.fd;
  1073.   IF t2<1
  1074.     THEN
  1075.       BEGIN
  1076.         ansic(8);
  1077.         print('You don''t have any turns left.');
  1078.         DROP := TRUE;
  1079.         ansic(1);
  1080.       END
  1081.     ELSE
  1082.       BEGIN
  1083.         if not autop then
  1084.         begin
  1085.            warped;
  1086.            prompt('To which Sector? ');
  1087.            INPUT(i,4);
  1088.            t := value(i);
  1089.         end
  1090.         else
  1091.         begin
  1092.            t := s[asd,1];
  1093.         end;
  1094.         IF (t<1) OR (t>1000)
  1095.           THEN
  1096.             print('Illegal number.')
  1097.           ELSE
  1098.             BEGIN
  1099.               done := FALSE;
  1100.               FOR l:=1 TO 6 DO
  1101.                 IF (e[l]=t)
  1102.                   THEN
  1103.                     done := TRUE;
  1104.               IF NOT done
  1105.                 THEN
  1106.                   BEGIN
  1107.                     nl;
  1108.                     print('That Warp Lane is currently closed.');
  1109.                     drop := TRUE;
  1110.                   END
  1111.                 ELSE
  1112.                   BEGIN
  1113.                     t2 := t2-1;
  1114.                     removeship(pn);
  1115.                     userr.ff := t;
  1116.                     userr.fq := prr;
  1117.                     userr.fd := t2;
  1118.                     writeout(pn,userr);
  1119.                     addship(pn);
  1120.                     IF (t2=10) OR (t2<6)
  1121.                       THEN
  1122.                         BEGIN
  1123.                           nl;
  1124.                           print('You have '+cstr(t2)+' turns left.');
  1125.                         END;
  1126.                     enterroom;
  1127.                   END;
  1128.             END;
  1129.       END;
  1130. END;
  1131.  
  1132. FUNCTION addblank(b:STR;l:INTEGER): STR;
  1133. BEGIN
  1134.   WHILE LENGTH(b)< l DO
  1135.     b := ' '+b;
  1136.   addblank := b;
  1137. END;
  1138.  
  1139. PROCEDURE upport(s2:INTEGER);
  1140.  
  1141.   VAR
  1142.       p2,c,l,code,mn : INTEGER;
  1143.       temp,dim           : REAL;
  1144. BEGIN
  1145.   readin(s2,usert);
  1146.   p2 := usert.fh+ls;
  1147.   readin(p2,usert);
  1148.   n[1] := usert.fd+usert.fr/10000;
  1149.   n[2] := usert.fe+usert.fo/10000;
  1150.   n[3] := usert.ff+usert.fp/10000;
  1151.   pub[1] := usert.fg;
  1152.   pub[2] := usert.fh;
  1153.   pub[3] := usert.fi;
  1154.   c1[1] := usert.fj;
  1155.   c1[2] := usert.fk;
  1156.   c1[3] := usert.fl;
  1157.   getdate;
  1158.   c := d;
  1159.   mn := value(COPY(time,1,2))*60+value(COPY(time,4,2));
  1160.   dim := d-usert.fc+(mn-usert.fq)/1440;
  1161.   IF dim>=0
  1162.     THEN
  1163.       BEGIN
  1164.         IF dim>10
  1165.           THEN
  1166.             dim := 10.0;
  1167.         FOR l:=1 TO 3 DO
  1168.           BEGIN
  1169.             n[l] := n[l]+pub[l]*dim;
  1170.             IF n[l]>pub[l]*10
  1171.               THEN
  1172.                 n[l] := pub[l]*10;
  1173.           END;
  1174.       END;
  1175.   FOR l:=1 TO 3 DO
  1176.     m[l] := INT(b[l]*(1-c1[l]*n[l]/pub[l]/1000)+0.5);
  1177.   readin(p2,usert);
  1178.   usert.fc := c;
  1179.   usert.fd := TRUNC(n[1]);
  1180.   usert.fe := TRUNC(n[2]);
  1181.   usert.ff := TRUNC(n[3]);
  1182.   FOR l:=1 TO 3 DO
  1183.     BEGIN
  1184.       srr[l,0] := INT((n[l]-INT(n[l]))*10000+0.5);
  1185.       n[l] := INT(n[l]);
  1186.     END;
  1187.   usert.fr := TRUNC(srr[1,0]);
  1188.   usert.fo := TRUNC(srr[2,0]);
  1189.   usert.fp := TRUNC(srr[3,0]);
  1190.   usert.fq := mn;
  1191.   writeout(p2,usert);
  1192. END;
  1193.  
  1194. PROCEDURE otherport(p2:INTEGER);
  1195.  
  1196.   VAR
  1197.       i: INTEGER;
  1198.       ni,HI : ARRAY[0..3] OF INTEGER;
  1199. BEGIN
  1200.   h[0] := userr.fh;
  1201.   h[1] := userr.fi;
  1202.   h[2] := userr.fj;
  1203.   h[3] := userr.fk;
  1204.   FOR i:=1 TO 3 DO
  1205.     BEGIN
  1206.       ni[i] := TRUNC(n[i]);
  1207.       HI[i] := TRUNC(h[i]);
  1208.     END;
  1209.   readin(p2,usert);
  1210.   nl;
  1211.   ansic(3);
  1212.   print('Commerce report for '+usert.fa+': '+date+' '+time);
  1213.   nl;
  1214.   ansic(5);
  1215.   print(' Items     Status   # units  in holds');
  1216.   print(' ~~~~~     ~~~~~~   ~~~~~~~  ~~~~~~~~');
  1217.   ansic(1);
  1218.   FOR i:=1 TO 3 DO
  1219.     BEGIN
  1220.       prompt(p[i]);
  1221.       IF c1[i]<0.0
  1222.         THEN
  1223.           prompt(' Buying  ')
  1224.         ELSE
  1225.           prompt(' Selling ');
  1226.       prompt(addblank(cstr(ni[i]),7));
  1227.       print (addblank(cstr(HI[i]),9));
  1228.     END;
  1229. END;
  1230.  
  1231. (*$I MAINT.PAS *)
  1232.  
  1233. (*$I team.pas *)
  1234.  
  1235.  
  1236. PROCEDURE port1;
  1237.  
  1238.   VAR
  1239.       mi : ARRAY[0..4] OF INTEGER;
  1240. BEGIN
  1241.   m[1] := 50 * SIN(0.89756 * d);
  1242.   m[2] := 8 * SIN(0.89714 * d + 1.5707);
  1243.   nl;
  1244.   m[1] := m[1]+500;
  1245.   m[2] := m[2]+100;
  1246.   m[3] := 200-m[2];
  1247.   mi[1] := ROUND(m[1]);
  1248.   mi[2] := ROUND(m[2]);
  1249.   mi[3] := ROUND(m[3]);
  1250.   ansic(3);
  1251.   print('Commerce report for: '+date+' '+time);
  1252.   ansic(5);
  1253.   print('  Cargo holds  : '+cstr(mi[1])+' credits/hold');
  1254.   ansic(2);
  1255.   print('  Fighters     : '+cstr(mi[2])+' credits/fighter');
  1256.   ansic(2);
  1257.   print('  Shield Points: '+cstr(mi[3])+' credits/point');
  1258.   ansic(4);
  1259.   print('  Turns        : 300 credits each.');
  1260.   nl;
  1261.   ansic(1);
  1262. END;
  1263.  
  1264. (*$I OVER.PAS *)
  1265.  
  1266. PROCEDURE mainmenu;
  1267.  
  1268.   VAR
  1269.       i: STR;
  1270.       INT : INTEGER;
  1271. BEGIN
  1272.   dump;
  1273.   tleft;
  1274.   nl;
  1275.   prompt('Command (?=Help)? ');
  1276.   mmkey(i);
  1277.   IF i=''
  1278.     THEN
  1279.       print('? = Help');
  1280.   CASE i[1] OF
  1281.     'A' : kill;
  1282.     'P' : PORT;
  1283.     'L' : planet;
  1284.     'C' : computer;
  1285.     'F' : fighters;
  1286.     'M' : moveit;
  1287.     'B' : minedrop;
  1288.     'G' : fighterscan;
  1289.     'E' : corbomite;
  1290.     'S' : setautopilot;
  1291.     'T' : team;
  1292.     'I' : BEGIN
  1293.             print('<Info>');
  1294.             info(pn);
  1295.           END;
  1296.     'Z' : BEGIN
  1297.             prompt('Do you want instructions (Y/N) [N]? ');
  1298.             IF yn THEN printfile('tradewar\TWINSTR.DOC');
  1299.           END;
  1300.     'D' : BEGIN
  1301.             print('<Display>');
  1302.             showroom;
  1303.           END;
  1304.     'Q' : begin
  1305.             print('<Quit>');
  1306.             prompt('Confirmed? (Y/N)? ');
  1307.             IF yn THEN ended := TRUE;
  1308.           end;
  1309.    ELSE   begin
  1310.             ANSIC(8);
  1311.             PRINT('<Help>');
  1312.             NL;
  1313.             printfile('tradewar\twmenu.msg');
  1314.           end;
  1315.   END;
  1316. END;
  1317.  
  1318. BEGIN
  1319.   cls;
  1320.   iport;
  1321.   ended := FALSE;
  1322.   IF NOT hangup
  1323.     THEN
  1324.       init;
  1325.   IF (NOT ended) AND (NOT hangup)
  1326.     THEN
  1327.       starting;
  1328.   WHILE (NOT ended) AND (NOT hangup) DO
  1329.     mainmenu;
  1330.   CLOSE(userf);
  1331.   CLOSE(msger);
  1332.   CLOSE(smg);
  1333.   CLOSE(teams);
  1334.   ret := 200;
  1335.   return;
  1336. END.
  1337.